home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Scene 96
/
Scene 96 International Edition (Zyklop Software) (Disc 1) (1997).iso
/
intros
/
64k
/
revolt
/
sources
/
3engine.as3
next >
Wrap
Text File
|
1996-01-25
|
31KB
|
1,575 lines
;CONST
ile_gene=2 ;number of cycles dither proccy
;gouraudIs=1
; BIT-SORT
; CALCULATE-VERTEX-NORMALS
; SQRT
; MAKE simple LIGHT (not moved)
jumps
.386p
CODE32 SEGMENT PARA PUBLIC USE32
ASSUME cs:CODE32, ds:CODE32
include pmode.inc
include rotatem.ext
widoczno₧ì db 0 ;jak zero to sprawdzaì
PUBLIC widoczno₧ì
PUBLIC drawFacesVE
PUBLIC drawFacesVCE
EXTRN bene :BYTE
EXTRN poin2d :WORD
;sortowanie bitowe
EXTRN sumy_z :DWORD
EXTRN sort_adr :DWORD
EXTRN sort_prz :DWORD
EXTRN kolejno₧ì :WORD
PUBLIC max_n_of_faces
EXTRN adr_faces :DWORD
EXTRN adr_points :DWORD
EXTRN adr_versor :DWORD
EXTRN adr_colors :DWORD ;11:20
EXTRN number_f :DWORD
EXTRN number_p :DWORD
EXTRN adr_pixels :DWORD
EXTRN lightE :WORD
PUBLIC make_lightE
PUBLIC _mem
PUBLIC _sort
;u₧rednione wersory normalne...
EXTRN nor_to_faces :WORD
EXTRN wersory :WORD
EXTRN ilo₧ì_wer :DWORD
PUBLIC calc_nor
;pierwiastek
PUBLIC _sqrt
;ºarówka :) making light
EXTRN light :BYTE
PUBLIC make_light
;rysowanie
EXTRN inc_xxx :DWORD
EXTRN inc_yyy :DWORD
EXTRN inc_zzz :DWORD
EXTRN versory:WORD
PUBLIC generate32env
ifDEF gouraudIs
PUBLIC drawFacesV
PUBLIC drawFacesVC ;11:25
ENDif
PUBLIC copypoints
PUBLIC rotatety
PUBLIC rotatety2
ifDEF gouraudIs
PUBLIC gouraud
ENDIF
PUBLIC text
EXTRN draw_where :DWORD
IRPC roxi,<123>
EXTRN gou_x&roxi :DWORD
EXTRN gou_y&roxi :DWORD
EXTRN gou_c&roxi :BYTE
EXTRN delta&roxi :DWORD
EXTRN dC&roxi :DWORD
ENDM
PUBLIC zdelta
PUBLIC d_x
PUBLIC d_y
; a tu juº wewnætrzne>>
sort_adres dd 1638
max_n_of_faces equ 2000
sort_drawers equ 1096
sort_memory equ sort_drawers*4*16+1024
pan1 equ 0
pan2 equ 4
pan3 equ 8
pan4 equ 12
clipup equ 0
clipdown equ 199
clipleft equ 0
clipright equ 319
;clipy do texturowania
clipu equ 0
clipd equ 199
clipl equ 0
clipr equ 319
clipuu dd clipu*320
clipdd dd clipd*320
clipll dd clipl
cliprr dd clipr
PUBLIC first_vertex
PUBLIC second_vertex
PUBLIC third_vertex
IRPC roxi,<123>
PUBLIC x&roxi
PUBLIC y&roxi
PUBLIC xt&roxi
PUBLIC yt&roxi
ENDM
first_vertex:
x1e dw 0
x1 dw 0
y1e dw 0
y1 dw 0
xt1e dw 0
xt1 dw 0
yt1e dw 0
yt1 dw 0
second_vertex:
x2e dw 0
x2 dw 0
y2e dw 0
y2 dw 0
xt2e dw 0
xt2 dw 0
yt2e dw 0
yt2 dw 0
third_vertex:
x3e dw 0
x3 dw 0
y3e dw 0
y3 dw 0
xt3e dw 0
xt3 dw 0
yt3e dw 0
yt3 dw 0
h dd 0
w dd 0
dxxx1 dd 0
dyyy1 dd 0
adr_l dd offset left ;adres do lewej strony krawædzi
adr_r dd offset right ;a tutaj do prawej
adr_1 dd 0
adr_2 dd 0
adr_3 dd 0
_liner dd 0
;
; [ _MEM ] - allokuje pamiæì dla sortowania bitowego...
;
_mem PROC
mov eax,sort_memory
call _getHiMem
jnc jmem
jmp _exit
jmem: mov sort_adres,eax
lea edi,sort_adr
REPT 16
stosd
add eax,sort_drawers*4
ENDM
ret
_mem ENDP
;
; [ _SORT ] - gÆówna procka sortujåca...
; inSide that: suma zetów, sortowanie, kolejno₧ì...
; out : tablca [KOLEJNOÿò]
;
_sort PROC
mov esi,adr_points
lea edi,poin2d
mov ecx,number_p
call persp
sort_addding equ 5000
mov esi,adr_faces
lea edi,sumy_z
xor ebx,ebx
mov ecx,number_f
shl ecx,16
neg ecx
@sdist: movsx eax, word ptr [esi]
mov ebp,eax
shl ebp,1
add ebp,adr_points
mov bx , word ptr [eax*4+ebp+4]
movsx eax, word ptr [esi+2]
mov ebp,eax
shl ebp,1
add ebp,adr_points
add bx , word ptr [eax*4+ebp+4]
movsx eax, word ptr [esi+4]
mov ebp,eax
shl ebp,1
add ebp,adr_points
add bx , word ptr [eax*4+ebp+4]
add bx , sort_addding
mov dword ptr [edi],ebx
add edi,4
add esi,6
add ebx,010000h
add ecx,010000h
js @sdist
; a tu juº po sumowaniu zet'ów...
IRPC katha,<123>
local bsort,shift,sorwÆ,pddd,@next
mov byte ptr [shift-1],pan&katha
bSort: lea edi,sort_prz
mov ecx,16
xor eax,eax
rep stosd
; sortowanie wÆa₧ciwe
mov esi,offset sumy_z
mov ebp,offset sort_prz
mov ecx,number_f
sorwÆ: lodsd
mov ebx,eax
shr ebx,0fh
shift: and ebx,0fh
mov edi,dword ptr sort_prz[ebx*4]
inc dword ptr sort_prz[ebx*4]
mov edx,dword ptr sort_adr[ebx*4]
mov [edx+edi*4],eax
loop sorwÆ
; make [kolejno₧ì] table
mov ebp,offset sort_prz
mov edi,offset sumy_z
mov esi,sort_adres
mov ecx,16
pddd: push ecx esi
mov edx,dword ptr [ebp]
or edx,edx
jz @next
mov ecx,edx
rep movsd
@next: pop esi ecx
add ebp,4
add esi,sort_drawers*4
loop pddd
ENDM
mov eax,number_f
lea esi,sumy_z[(eax*4)-2]
lea edi,kolejno₧ì
mov ecx,number_f
xor eax,eax
@popo: movsw ;kolejno₧ì
sub esi,6 ;miniæcie sumy zeta
loop @popo
ret
_sort ENDP
ShFa db 8
ZDelta dd 200
d_x dw 160
d_y dw 100
persp PROC
movsx ebx,word ptr [esi+4]
add ebx,ZDelta
movsx eax,word ptr [esi]
neg eax
sal eax,8
mov edx,eax
sar edx,31
idiv ebx
add ax,d_x
mov word ptr [edi],ax
movsx eax,word ptr [esi+2]
sal eax,8
mov edx,eax
sar edx,31
idiv ebx
add ax,d_y
mov word ptr [edi+2],ax
add edi,4
add esi,6
dec cx
jnz persp
ret
persp ENDP
; na wej₧ciu ESI - z bitmapå 32x32...
generate32env PROC
; --- env32 --> env128
; lea esi,map32
lea edi,bene
mov ecx,32
@jac0: push ecx
mov ecx,32
@jac1: xor eax,eax
mov al,[esi]
mov ah,al
mov bx,ax
ror eax,16
or ax,bx
mov [edi+000],eax
mov [edi+128],eax
mov [edi+256],eax
mov [edi+384],eax
add edi,4
inc esi
loop @jac1
add edi,128*3
pop ecx
loop @jac0
mov esi,offset bene
mov edi,offset bene-128
mov ecx,32
rep movsd
mov esi,offset bene+128*127
mov edi,offset bene+128*128
mov ecx,32
rep movsd
; ---
mov ecx,ile_gene
@p12: push ecx
lea esi,bene
mov ecx,128*128
@p11: movzx ax,byte ptr [esi-1]
movzx bx,byte ptr [esi+1]
add ax,bx
movzx bx,byte ptr [esi+127]
add ax,bx
movzx bx,byte ptr [esi-127]
add ax,bx
shr ax,2
mov [esi],al
inc esi
loop @p11
pop ecx
loop @p12
ret
generate32env ENDP
;
; [ CALC_NOR ] PROC
;
; U₧rednione wersory normalne - wynik zwracany do tablicy wersory !
; in : adr_faces, adr_points, number_f, number_p
; out: vertex normals in [WERSORY] table...
;
nnx1 dd ?
nny1 dd ?
nnz1 dd ?
nnx2 dd ?
nny2 dd ?
nnz2 dd ?
nnx3 dd ?
nny3 dd ?
nnz3 dd ?
norX dd ?
norY dd ?
norZ dd ?
calc_nor PROC
mov esi,adr_faces
lea edi,nor_to_faces
mov ecx,number_f
@cnv: push ecx
xor ebx,ebx
mov bx,word ptr [esi]
mov eax,ebx
shl eax,2
lea ebp,[eax+ebx*2]
mov edx,adr_pixels
movsx eax,word ptr [edx+ebp]
mov nnx1,eax
movsx eax,word ptr [edx+ebp+2]
mov nny1,eax
movsx eax,word ptr [edx+ebp+4]
mov nnz1,eax
mov bx,word ptr [esi+2] ;nexte pointe fejse
mov eax,ebx
shl eax,2
lea ebp,[eax+ebx*2]
movsx eax,word ptr [edx+ebp]
mov nnx2,eax
movsx eax,word ptr [edx+ebp+2]
mov nny2,eax
movsx eax,word ptr [edx+ebp+4]
mov nnz2,eax
mov bx,word ptr [esi+4] ;bozon shading?
mov eax,ebx
shl eax,2
lea ebp,[eax+ebx*2]
movsx eax,word ptr [edx+ebp]
mov nnx3,eax
movsx eax,word ptr [edx+ebp+2]
mov nny3,eax
movsx eax,word ptr [edx+ebp+4]
mov nnz3,eax
mov eax,nny2
sub eax,nny1
mov ebp,nnz3
sub ebp,nnz1
imul ebp
mov ebx,eax ;(y2-y1)(z3-z1)
mov eax,nny3
sub eax,nny1
mov ebp,nnz2
sub ebp,nnz1
imul ebp ;(y3-y1)(z2-z1)
sub ebx,eax
neg ebx
mov norX,ebx
mov eax,nnx2
sub eax,nnx1
mov ebp,nnz3
sub ebp,nnz1
imul ebp
mov ebx,eax ;(x2-x1)(z3-z1)
mov eax,nnx3
sub eax,nnx1
mov ebp,nnz2
sub ebp,nnz1
imul ebp ;(x3-x1)(z2-z1)
sub ebx,eax
mov norY,ebx
mov eax,nny2
sub eax,nny1
mov ebp,nnx3
sub ebp,nnx1
imul ebp
mov ebx,eax ;(y2-y1)(x3-x1)
mov eax,nny3
sub eax,nny1
mov ebp,nnx2
sub ebp,nnx1
imul ebp ;(y3-y1)(x2-x1)
sub ebx,eax
neg ebx
mov norZ,ebx
; dÆugo₧ì wektora normalnego!
mov eax,norX
mov ebx,norY
mov ecx,norZ
imul eax,eax
imul ebx,ebx
imul ecx,ecx
add ecx,eax
add ecx,ebx
call _sqrt
shr eax,8
mov ebx,eax ;pierwiastek
or ebx,ebx
jnz @norm
mov word ptr [edi],0
mov word ptr [edi+2],0
mov word ptr [edi+4],0
jmp ponor
@norm:
; normalizacja do 255..
mov eax,norX
cdq
shld eax,edx,8
idiv ebx
mov word ptr [edi],ax
mov eax,norY
cdq
shld eax,edx,8
idiv ebx
mov word ptr [edi+2],ax
mov eax,norZ
cdq
shld eax,edx,8
idiv ebx
mov word ptr [edi+4],ax
ponor:
add edi,6
add esi,6
pop ecx
loop @cnv
; no to bierzemy siæ za u₧rednione wersory normalne...
; dodajæ wsp.kaºdego wyståpienia wierzch. i dzielæ przez
; ilo₧ì wyståpieñ...
lea edi,ilo₧ì_wer
xor eax,eax
mov ecx,number_p
rep stosd
lea edi,wersory
mov ecx,number_p
lea ecx,[ecx*2+ecx]
rep stosw
mov ecx,number_f
mov esi,adr_faces
lea ebp,nor_to_faces
@u₧r: xor ebx,ebx
mov bx, word ptr [esi]
mov eax,ebx
shl eax,2
inc dword ptr [offset ilo₧ì_wer+eax]
lea ebx,[ebx*2+eax]
mov ax,word ptr [ebp]
add word ptr [offset wersory+ebx],ax
mov ax,word ptr [ebp+2]
add word ptr [offset wersory+ebx+2],ax
mov ax,word ptr [ebp+4]
add word ptr [offset wersory+ebx+4],ax
mov bx, word ptr [esi+2]
mov eax,ebx
shl eax,2
inc dword ptr [offset ilo₧ì_wer+eax]
lea ebx,[ebx*2+eax]
mov ax,word ptr [ebp]
add word ptr [offset wersory+ebx],ax
mov ax,word ptr [ebp+2]
add word ptr [offset wersory+ebx+2],ax
mov ax,word ptr [ebp+4]
add word ptr [offset wersory+ebx+4],ax
mov bx, word ptr [esi+4]
mov eax,ebx
shl eax,2
inc dword ptr [offset ilo₧ì_wer+eax]
lea ebx,[ebx*2+eax]
mov ax,word ptr [ebp]
add word ptr [offset wersory+ebx],ax
mov ax,word ptr [ebp+2]
add word ptr [offset wersory+ebx+2],ax
mov ax,word ptr [ebp+4]
add word ptr [offset wersory+ebx+4],ax
add ebp,6
add esi,6
loop @u₧r
lea esi,wersory
lea ebp,ilo₧ì_wer
mov ecx,number_f
@u₧v:
mov ebx,[ebp]
or ebx,ebx
jnz lu₧
mov word ptr [esi],0
mov word ptr [esi+2],0
mov word ptr [esi+4],0
jmp polu₧
lu₧:
movsx eax,word ptr [esi]
cdq
idiv ebx
mov word ptr [esi],ax
movsx eax,word ptr [esi+2]
cdq
idiv ebx
mov word ptr [esi+2],ax
movsx eax,word ptr [esi+4]
cdq
idiv ebx
mov word ptr [esi+4],ax
polu₧:
add ebp,4
add esi,6
loop @u₧v
ret
calc_nor ENDP
;
; [ _sqrt ] - pierwastek low precision ... comes from birthday intro!
;
_sqrt PROC
xor eax,eax
mov ebx,40000000h
sqrtLP1:
mov edx,ecx
sub edx,ebx
jl sqrtLP2
sub edx,eax
jl sqrtLP2
mov ecx,edx
shr eax,1
or eax,ebx
shr ebx,2
jnz sqrtLP1
shl eax,8
ret
sqrtLP2:
shr eax,1
shr ebx,2
jnz sqrtLP1
shl eax,8
ret
_sqrt ENDP
;
; [ _MAKE_LIGHT ] - dyz proccy is making light...
; Sun is on de sky (not moved)....
;
make_light PROC
lea edi,light
mov esi,adr_versor
mov ecx,number_p
shl ecx,16
neg ecx
@swia: push ecx
movsx eax,word ptr [esi]
movsx ebx,word ptr [esi+2]
movsx ecx,word ptr [esi+4]
imul eax,eax
imul ebx,ebx
imul ecx,ecx
add ecx,eax
add ecx,ebx
call _sqrt
shr eax,8
mov ebp,eax
or ebp,ebp
jz @lik2
movsx eax,word ptr [esi+4]
sal eax,6
cdq
idiv ebp
cdq
xor eax,edx
sub eax,edx
cmp eax,63
jb @lik
mov eax,62
@lik: inc al
mov byte ptr [edi],al
inc edi
add esi,6
pop ecx
add ecx,010000h
js @swia
ret
@lik2: mov byte ptr [edi],1
inc edi
add esi,6
pop ecx
add ecx,010000h
js @swia
ret
make_light ENDP
IFDEF gouraudIs
;
; [ DRAWfACESv ] - dyz shitty procedure draws my objects...
;
drawFacesV PROC
lea esi,kolejno₧ì
mov edi,adr_faces
lea ebp,poin2d
mov ecx,number_f
dfLoop: push esi edi ecx ebp
xor eax,eax
mov ax,word ptr [esi]
mov ebx,eax
shl ebx,2
lea eax,[ebx+eax*2]
mov bx,word ptr [edi+eax]
mov dl,byte ptr [offset light+ebx]
mov gou_c1,dl
shl ebx,2
movsx edx,word ptr [ebp+ebx]
mov gou_x1,edx
mov vx1,dx
movsx edx,word ptr [ebp+ebx+2]
mov gou_y1,edx
mov vy1,dx
mov bx,word ptr [edi+eax+2]
mov dl,byte ptr [offset light+ebx]
mov gou_c2,dl
shl ebx,2
movsx edx,word ptr [ebp+ebx]
mov gou_x2,edx
mov vx2,dx
movsx edx,word ptr [ebp+ebx+2]
mov gou_y2,edx
mov vy2,dx
mov bx,word ptr [edi+eax+4]
mov dl,byte ptr [offset light+ebx]
mov gou_c3,dl
shl ebx,2
movsx edx,word ptr [ebp+ebx]
mov gou_x3,edx
mov vx3,dx
movsx edx,word ptr [ebp+ebx+2]
mov gou_y3,edx
mov vy3,dx
call isVisible
mov al,visible
or al,al
jnz nous
call gouraud
nous: pop ebp ecx edi esi
add esi,2
loop dfLoop
ret
drawFacesV ENDP
; draw faces with colors and checking visible it...
drawFacesVC PROC
lea esi,kolejno₧ì
mov edi,adr_faces
lea ebp,poin2d
mov ecx,number_f
@dfLoop:push esi edi ecx ebp
xor eax,eax
mov ax,word ptr [esi]
mov edx,adr_colors
mov dl ,byte ptr [edx+eax]
mov ccccc,dl
mov ebx,eax
shl ebx,2
lea eax,[ebx+eax*2]
mov bx,word ptr [edi+eax]
mov dl,byte ptr [offset light+ebx]
add dl,ccccc
mov gou_c1,dl
shl ebx,2
movsx edx,word ptr [ebp+ebx]
mov gou_x1,edx
mov vx1,dx
movsx edx,word ptr [ebp+ebx+2]
mov gou_y1,edx
mov vy1,dx
mov bx,word ptr [edi+eax+2]
mov dl,byte ptr [offset light+ebx]
add dl,ccccc
mov gou_c2,dl
shl ebx,2
movsx edx,word ptr [ebp+ebx]
mov gou_x2,edx
mov vx2,dx
movsx edx,word ptr [ebp+ebx+2]
mov gou_y2,edx
mov vy2,dx
mov bx,word ptr [edi+eax+4]
mov dl,byte ptr [offset light+ebx]
add dl,ccccc
mov gou_c3,dl
shl ebx,2
movsx edx,word ptr [ebp+ebx]
mov gou_x3,edx
mov vx3,dx
movsx edx,word ptr [ebp+ebx+2]
mov gou_y3,edx
mov vy3,dx
call isVisible
mov al,visible
or al,al
jnz @nous
call gouraud
@nous: pop ebp ecx edi esi
add esi,2
loop @dfLoop
ret
ccccc db 0
drawFacesVC ENDP
ENDIF
;
; [ isVisible ] - is my poly visible???
;
vx1 dw 0
vy1 dw 0
vz1 dw 0
vx2 dw 0
vy2 dw 0
vz2 dw 0
vx3 dw 0
vy3 dw 0
vz3 dw 0
visible db 0
isVisible PROC
mov visible,0
mov ax,vY2
sub ax,vY1
mov bx,vX3
sub bx,vX1
imul bx
mov cx,ax
mov ax,vY3
sub ax,vY1
mov bx,vX2
sub bx,vX1
imul bx
sub cx,ax
neg cx
js noVis
mov visible,1
noVis: ret
isVisible ENDP
copyPoints PROC
mov esi,adr_pixels
mov edi,adr_points
mov ecx,number_p
lea ecx,[ecx*2+ecx]
push ecx
rep movsw
lea esi,wersory
lea edi,versory
pop ecx
rep movsw
ret
copyPoints ENDP
rotatety PROC
mov esi,adr_points
mov ecx,number_p
call _rotatem
neg angleX
neg angleY
neg angleZ
lea esi,versory
mov ecx,number_p
call _rotatem
neg angleX
neg angleY
neg angleZ
mov eax,inc_xxx
add angleX,eax
mov eax,inc_yyy
add angleY,eax
mov eax,inc_zzz
add angleZ,eax
ret
rotatety ENDP
rotatety2 PROC
mov esi,adr_points
mov ecx,number_p
call _rotatem
ret
rotatety2 ENDP
; ------------------------------------------- GOURAUD feee
IFDEF gouraudIs
gouraud PROC
mov ebx,gou_y1
mov esi,gou_y2
mov edi,gou_y3
mov cx,word ptr [gou_c1]
mov dl,byte ptr [gou_c3]
cmp ebx,esi ; y1 with y2
jl gs_1ok1
xchg ebx,esi
mov eax,dword ptr [offset gou_x1] ; x1
xchg eax,dword ptr [offset gou_x1+8] ; exchange x2
mov dword ptr [offset gou_x1],eax
xchg cl,ch
gs_1ok1:
cmp ebx,edi
jl gs_2ok
xchg ebx,edi
mov eax,dword ptr [offset gou_x1]
xchg eax,dword ptr [offset gou_x1+16]
mov dword ptr [offset gou_x1],eax
xchg cl,dl
gs_2ok:
cmp esi,edi
jl gs_3ok
xchg esi,edi
mov eax,dword ptr [offset gou_x1+8]
xchg eax,dword ptr [offset gou_x1+16]
mov dword ptr [offset gou_x1+8],eax
xchg ch,dl
gs_3ok:
cmp ebx,clipDown
jg endgou ; when y1>dolnego zakresu
cmp edi,clipUp
jl endgou ; when y3<górnego 0-zakresu
cmp ebx,edi
je flat_line
mov dword ptr [offset gou_x1+4] ,ebx
mov dword ptr [offset gou_x1+12],esi
mov dword ptr [offset gou_x1+20],edi
mov word ptr [offset gou_c1],cx
mov byte ptr [offset gou_c1+2],dl
mov ebx,dword ptr [offset gou_y2]
sub ebx,dword ptr [offset gou_y1]
jnz dXX1
mov delta1,0
mov dC1,0
jmp boFla1
dXX1: mov eax,dword ptr [offset gou_x2]
sub eax,dword ptr [offset gou_x1]
jnz nDech1
xor eax,eax ; wiæc po co dzieliì...
jmp decha1
nDech1: sal eax,16
cdq
idiv ebx
decha1: mov delta1,eax
movzx eax,byte ptr [offset gou_c2]
movzx ecx,byte ptr [offset gou_c1]
sub eax,ecx
jnz milky1
xor eax,eax ; dC1=eax/Y gdzie eax=0 so...
jmp mle1
milky1: sal eax,16
cdq
idiv ebx
mle1: mov dC1,eax
boFla1:
; nastæpny - i hope it runs...
mov ebx,dword ptr [offset gou_y3]
sub ebx,dword ptr [offset gou_y2]
jnz dXX2
mov delta2,0
mov dC2,0
jmp boFla2
dXX2: mov eax,dword ptr [offset gou_x3]
sub eax,dword ptr [offset gou_x2]
jnz nDech2
xor eax,eax ; wiæc po co dzieliì...
jmp decha2
nDech2: sal eax,16
cdq
idiv ebx
decha2: mov delta2,eax
movzx eax,byte ptr [offset gou_c3]
movzx ecx,byte ptr [offset gou_c2]
sub eax,ecx
jnz milky2
xor eax,eax ; dC1=eax/Y gdzie eax=0 so...
jmp mle2
milky2: sal eax,16 ; chyba kobiety mi siæ chce...
cdq
idiv ebx
mle2: mov dC2,eax
boFla2:
mov ebx,dword ptr [offset gou_y3]
sub ebx,dword ptr [offset gou_y1]
jnz dXX3
mov delta3,0
mov dC3,0
jmp boFla3
dXX3: mov eax,dword ptr [offset gou_x3]
sub eax,dword ptr [offset gou_x1]
jnz nDech3
xor eax,eax ; wiæc po co dzieliì...
jmp decha3
nDech3: sal eax,16
cdq
idiv ebx
decha3: mov delta3,eax
movzx eax,byte ptr [offset gou_c3]
movzx ecx,byte ptr [offset gou_c1]
sub eax,ecx
jnz milky3
xor eax,eax ; dC1=eax/Y gdzie eax=0 so...
jmp mle3
milky3: sal eax,16 ; chyba kobiety mi siæ chce...
cdq
idiv ebx
mle3: mov dC3,eax
boFla3:
; no to teras trzeba zrobiì pierwszy obieg...
; i zobaczymy jak to wyjdzie...
mov eax,dword ptr [offset gou_x1]
sal eax,16
mov ebx,eax
movzx ecx,byte ptr [offset gou_c1]
shl ecx,16
mov edx,ecx
mov ebp,dword ptr [offset gou_y1] ; a co?
mov edi,draw_where
linG1:
cmp ebp,dword ptr [offset gou_Y2]
je fuck2
cmp ebp,clipUp
jl nodr1
cmp ebp,clipdown
jg endgou
push eax ebx ecx edx ebp edi
sar eax,16
sar ebx,16
sar ecx,16
sar edx,16
add edi,dword ptr [offset a_ekr+ebp*4]
call HorizGouraud
pop edi ebp edx ecx ebx eax
noDr1: add eax,delta1
add ebx,delta3
add ecx,dC1
add edx,dC3
inc ebp
jmp linG1
fuck2:
mov eax,dword ptr [offset gou_x2]
sal eax,16
movzx ecx,byte ptr [offset gou_c2]
shl ecx,16
linG2: cmp ebp,clipUp
jl nodr2
cmp ebp,clipdown
jg endgou
push eax ebx ecx edx ebp edi
sar eax,16
sar ebx,16
sar ecx,16
sar edx,16
add edi,dword ptr [offset a_ekr+ebp*4]
call HorizGouraud
pop edi ebp edx ecx ebx eax
noDr2: add eax,delta2
add ebx,delta3
add ecx,dC2
add edx,dC3
inc ebp
cmp ebp,dword ptr [offset gou_Y3]
jle linG2
endgou:
ret
a_ekr: t=0
rept 200
dd t
t=t+320
endm
flat_line:
; here is flat gouraud line...
mov edi,draw_where
add edi,[offset a_ekr+ebx*4]
; and now i sort-x coordinates...
mov eax,dword ptr [offset gou_x1]
mov ebx,dword ptr [offset gou_x1+8]
mov esi,dword ptr [offset gou_x1+16]
cmp eax,ebx
jl gxs_1
xchg eax,ebx
xchg cl,ch
gxs_1: cmp eax,esi
jl gxs_2
xchg eax,esi
xchg cl,dl
gxs_2: cmp ebx,esi
jl gxs_3
xchg ebx,esi
xchg ch,dl
gxs_3:
mov ebx,esi ; last x
xchg eax,ebx ; eax=end ebx=start
movzx ecx,cl
movzx edx,dl
xchg ecx,edx
call HorizGouraud
ret
; eax,ebx = x1,x2
; edi = offset linii
; ecx,edx = c1,c2 BAD VERSION...
HorizGouraud:
cmp eax,ebx
je onlyPoint
; a to byì musi mimo wszystko...
cmp ebx,eax
jl HGok
xchg eax,ebx
xchg ecx,edx
HGok:
cmp eax,clipleft ; >
jl oPend
cmp ebx,clipright ; <
jg oPend
mov esi,eax ; end x
push ebx
sub eax,ebx ; x2-x1
shl ecx,16
shl edx,16
mov ebp,edx ; start color
sub ecx,edx ; c2-c1
xchg eax,ecx ; bo dC/dX
cdq
idiv ecx
pop ecx
xchg eax,ebp
lopHG:
cmp ecx,clipleft
jl nHG
cmp ecx,clipright
jg nHG
push eax
shr eax,16
mov byte ptr [edi+ecx],al
pop eax
nHG:
add eax,ebp
inc ecx
cmp ecx,esi
jle lopHG
ret
onlyPoint:
cmp eax,ClipLeft
jl oPend
cmp eax,Clipright
jg oPend
mov byte ptr [edi+eax],cl
oPend:
ret
gouraud ENDP
ENDIF ; -------------------------------- END of it...
left dw 300 DUP (?,?,?,?)
right dw 300 DUP (?,?,?,?)
add_col db 0
text PROC
mov adr_l,offset left
mov adr_r,offset right
lea esi,first_vertex
lea edi,second_vertex
lea ebp,third_vertex
mov eax,[esi+4] ;y1
cmp eax,[edi+4] ;y2
jl @s1
xchg esi,edi
@s1: mov eax,[esi+4] ;y1
cmp eax,[ebp+4] ;y3
jl @s2
xchg esi,ebp
@s2: mov eax,[edi+4] ;y2
cmp eax,[ebp+4] ;y3
jl @s3
xchg edi,ebp
@s3:
mov adr_1,esi
mov adr_2,edi
mov adr_3,ebp
movsx eax,word ptr [esi+6] ;y1
movsx ecx,word ptr [ebp+6] ;y3
cmp eax,clipd
jg @endt
cmp ecx,clipu
jl @endt
sub ecx,eax
jz @endt
mov h,ecx
mov eax,[ebp] ;X3 test side of in my poly
sub eax,[esi] ;X1
mov ebx,[ebp+4] ;Y3
sub ebx,[edi+4] ;Y2
imul ebx
mov ebx,[ebp+4] ;Y3
sub ebx,[esi+4] ;Y1
idiv ebx
mov ebx,[ebp]
sub ebx,eax
cmp ebx,dword ptr [edi] ;x2
jg @side_ok
mov adr_l,offset right
mov adr_r,offset left
@side_ok:
mov ebp,adr_l
;LINE 1-2
mov ecx,[edi+4] ;y2
sub ecx,[esi+4] ;y1
jz @no12
shr ecx,16
mov eax,[edi] ;x2
sub eax,[esi] ;x1
cdq
idiv ecx
mov dword ptr DX12,eax
mov eax,[edi+8] ;tx2
sub eax,[esi+8] ;tx1
cdq
idiv ecx
mov dword ptr DTX12,eax
mov eax,[edi+12] ;ty2
sub eax,[esi+12] ;ty1
cdq
idiv ecx
mov dword ptr DTY12,eax
mov eax,[esi]
mov ebx,[esi+8]
mov edx,[esi+12]
@lup12:
add eax,422011 ;dx
DX12 =$-4
add ebx,422011 ;dtx
DTX12 =$-4
add edx,422011
DTY12 =$-4
mov [ebp+0],eax
mov [ebp+4],ebx
mov [ebp+8],edx
add ebp,16
dec ecx
jnz @lup12
@no12:
;LINE 2-3
mov esi,adr_2
mov edi,adr_3
mov ecx,[edi+4] ;y3
sub ecx,[esi+4] ;y2
jz @no23
shr ecx,16
mov eax,[edi] ;x3
sub eax,[esi] ;x2
cdq
idiv ecx
mov dword ptr DX23,eax
mov eax,[edi+8] ;tx3
sub eax,[esi+8] ;tx2
cdq
idiv ecx
mov dword ptr DTX23,eax
mov eax,[edi+12] ;ty3
sub eax,[esi+12] ;ty2
cdq
idiv ecx
mov dword ptr DTY23,eax
mov eax,[esi]
mov ebx,[esi+8]
mov edx,[esi+12]
@lup23:
add eax,422011 ;dx
DX23 =$-4
add ebx,422011 ;dtx
DTX23 =$-4
add edx,422011
DTY23 =$-4
mov [ebp+0],eax
mov [ebp+4],ebx
mov [ebp+8],edx
add ebp,16
dec ecx
jnz @lup23
@no23:
; LINE 1-3
mov ebp,adr_r
mov esi,adr_1
mov edi,adr_3
mov ecx,[edi+4] ;y3
sub ecx,[esi+4] ;y1
jz @no13
shr ecx,16
mov eax,[edi] ;x3
sub eax,[esi] ;x1
cdq
idiv ecx
mov dword ptr DX13,eax
mov eax,[edi+8] ;tx3
sub eax,[esi+8] ;tx1
cdq
idiv ecx
mov dword ptr DTX13,eax
mov eax,[edi+12] ;ty3
sub eax,[esi+12] ;ty1
cdq
idiv ecx
mov dword ptr DTY13,eax
mov eax,[esi]
mov ebx,[esi+8]
mov edx,[esi+12]
@lup13:
add eax,422011 ;dx
DX13 =$-4
add ebx,422011 ;dtx
DTX13 =$-4
add edx,422011
DTY13 =$-4
mov [ebp+0],eax
mov [ebp+4],ebx
mov [ebp+8],edx
add ebp,16
dec ecx
jnz @lup13
@no13:
; and the pætla rysujåca...
movsx eax,word ptr [esi+6] ;y1
mov edx,eax
shl edx,6
shl eax,8
add eax,edx
mov _liner,eax
lea esi,left
lea ebp,right
@scanline:
mov eax,_liner
mov EDI,draw_where
ADD EDI,EAX
cmp eax,clipuu ;ykowa górna
jl @skip_diz_line
cmp eax,clipdd ;ykowa dolna
jg @endt
movsx ecx,word ptr [ebp+2] ;x2
movsx ebx,word ptr [esi+2] ;x1
cmp ecx,clipl ;x2 z lewå
jl @skip_diz_line ;<to skip
cmp ebx,clipr
jg @skip_diz_line
sub ecx,ebx ;x2-x1
js @skip_diz_line
inc ecx
mov w,ecx
mov eax,[ebp+4] ;txR
sub eax,[esi+4] ;txL
cdq
idiv ecx
mov dxxx1,eax
mov eax,[ebp+8] ;tyR
sub eax,[esi+8] ;tyL
cdq
idiv ecx
mov dyyy1,eax
movsx ebx,word ptr [ebp+2] ;x2
cmp ebx,clipr
jle iopek
sub ebx,clipr
sub w,ebx
iopek:
movsx ecx,word ptr [esi+2] ;x1
cmp ecx,clipl
jge @nclip_left
;----clipleft
neg ecx ;jest <0
sub [w],ecx
add ecx,clipl ;staÆa two ticks
mov eax,dxxx1
imul ecx
add eax,[esi+4]
push eax
mov eax,dyyy1
imul ecx
mov ebx,eax
add ebx,[esi+8]
pop eax
;----
jmp @l000p
@nclip_left:
mov eax,[esi]
shr eax,16
add edi,eax
mov eax,[esi+4]
mov ebx,[esi+8]
@l000p:
add eax,dxxx1
add ebx,dyyy1
mov edx,eax
sar edx,9
and edx,-128
mov ecx,ebx
sar ecx,16
mov al,[bene+edx+ecx]
add al,add_col
mov byte ptr [edi],al
inc edi
dec w
jnz @l000p
@skip_diz_line:
add ebp,16
add esi,16
add _liner,320
dec h
jnz @scanline
@endt:
ret
text ENDP
make_lightE PROC
mov esi,adr_versor
mov ecx,number_p
lea edi,lightE
@mle: mov ax,[esi]
sar ax,2
add ax,64
mov [edi],ax
mov ax,[esi+2]
sar ax,2
add ax,64
mov [edi+2],ax
add edi,4
add esi,6
loop @mle
ret
make_lightE ENDP
;
; [ DRAWfACESv ] - dyz shitty procedure draws my objects...
;
drawFacesVE PROC
mov add_col,0
lea esi,kolejno₧ì
mov edi,adr_faces
lea ebp,poin2d
mov ecx,number_f
dfL00p: push esi edi ecx ebp
xor eax,eax
mov ax,word ptr [esi] ;kolejno₧ì
lea ebx,[eax*4]
lea eax,[ebx+eax*2] ;eax=eax*6
mov bx,word ptr [edi+eax] ;face
mov dx,[ebp+ebx*4] ;x1
mov [x1],dx
mov [vx1],dx ;and the same value...
mov dx,[ebp+ebx*4+2] ;y1
mov [y1],dx
mov [vy1],dx
mov dx,[lightE+ebx*4] ;xt1
mov [xt1],dx
mov dx,[lightE+ebx*4+2] ;yt1
mov [yt1],dx
mov bx,word ptr [edi+eax+2]
mov dx,[ebp+ebx*4]
mov [x2],dx
mov [vx2],dx
mov dx,[ebp+ebx*4+2]
mov [y2],dx
mov [vy2],dx
mov dx,[lightE+ebx*4] ;xt2
mov [xt2],dx
mov dx,[lightE+ebx*4+2] ;yt2
mov [yt2],dx
mov bx,word ptr [edi+eax+4]
mov dx,[ebp+ebx*4]
mov [x3],dx
mov [vx3],dx
mov dx,[ebp+ebx*4+2]
mov [y3],dx
mov [vy3],dx
mov dx,[lightE+ebx*4] ;xt3
mov [xt3],dx
mov dx,[lightE+ebx*4+2] ;yt3
mov [yt3],dx
call isVisible
mov al,visible
or al,al
jnz nouzz
call text
nouzz: pop ebp ecx edi esi
add esi,2
loop dfL00p
ret
drawFacesVE ENDP
;
; [ DRAWfACESv ] - dyz shitty procedure draws my objects...
;
drawFacesVCE PROC
lea esi,kolejno₧ì
mov edi,adr_faces
lea ebp,poin2d
mov ecx,number_f
dfL00p3:
push esi edi ecx ebp
xor eax,eax
mov ax,word ptr [esi] ;kolejno₧ì
mov ebx,adr_colors
mov dl,[ebx+eax]
mov add_col,dl
lea ebx,[eax*4]
lea eax,[ebx+eax*2] ;eax=eax*6
mov bx,word ptr [edi+eax] ;face
mov dx,[ebp+ebx*4] ;x1
mov [x1],dx
mov [vx1],dx ;and the same value...
mov dx,[ebp+ebx*4+2] ;y1
mov [y1],dx
mov [vy1],dx
mov dx,[lightE+ebx*4] ;xt1
mov [xt1],dx
mov dx,[lightE+ebx*4+2] ;yt1
mov [yt1],dx
mov bx,word ptr [edi+eax+2]
mov dx,[ebp+ebx*4]
mov [x2],dx
mov [vx2],dx
mov dx,[ebp+ebx*4+2]
mov [y2],dx
mov [vy2],dx
mov dx,[lightE+ebx*4] ;xt2
mov [xt2],dx
mov dx,[lightE+ebx*4+2] ;yt2
mov [yt2],dx
mov bx,word ptr [edi+eax+4]
mov dx,[ebp+ebx*4]
mov [x3],dx
mov [vx3],dx
mov dx,[ebp+ebx*4+2]
mov [y3],dx
mov [vy3],dx
mov dx,[lightE+ebx*4] ;xt3
mov [xt3],dx
mov dx,[lightE+ebx*4+2] ;yt3
mov [yt3],dx
mov al,widoczno₧ì
or al,al
jnz pipp
call isVisible
mov al,visible
or al,al
jnz nouzz3
pipp:
call text
nouzz3: pop ebp ecx edi esi
add esi,2
loop dfL00p3
ret
drawFacesVCE ENDP
CODE32 ENDS
END